// AI接口路由
const express = require('express');
const router = express.Router();
const aiServiceFactory = require('../services/ai/AIServiceFactory');

// 初始化AI服务
router.use(async (req, res, next) => {
  try {
    await aiServiceFactory.initialize();
    next();
  } catch (error) {
    console.error('[AI Route] Initialization failed:', error);
    res.status(500).json({
      code: 500,
      message: error.message
    });
  }
});

/**
 * 获取AI服务健康状态
 * GET /api/ai/health
 */
router.get('/health', async (req, res) => {
  try {
    const healthStatus = await aiServiceFactory.getHealthStatus();
    
    res.json({
      code: 200,
      message: "检查成功",
      data: healthStatus
    });
  } catch (error) {
    console.error('[AI Route] Health check failed:', error);
    res.status(500).json({
      code: 500,
      error: '健康检查失败',
      message: error.message
    });
  }
});

/**
 * 获取所有可用的AI服务信息
 * GET /api/ai/services
 */
router.get('/services', async (req, res) => {
  try {
    const servicesInfo = aiServiceFactory.getAllServicesInfo();
    
    res.json({
      code: 200,
      message: "获取服务信息成功",
      data: {
        services: servicesInfo,
        defaultProvider: aiServiceFactory.getDefaultService().name
      }
    });
  } catch (error) {
    console.error('[AI Route] Get services failed:', error);
    res.status(500).json({
      code: 500,
      error: '获取服务信息失败',
      message: error.message
    });
  }
});

/**
 * AI聊天接口
 * POST /api/ai/chat
 * Body: {
 *   messages: Array, // 消息数组
 *   provider: string, // 可选，指定AI服务提供商
 *   options: Object // 可选，额外选项
 * }
 */
router.post('/chat', async (req, res) => {
  try {
    const { messages, provider, options = {} } = req.body;
    
    // 参数验证
    if (!messages || !Array.isArray(messages) || messages.length === 0) {
      return res.status(400).json({
        code: 500,
        error: '参数错误',
        message: 'messages参数必须是非空数组'
      });
    }
    
    // 验证消息格式
    for (const message of messages) {
      if (!message.role || !message.content) {
        return res.status(400).json({
          code: 500,
          error: '参数错误',
          message: '每个消息必须包含role和content字段'
        });
      }
    }
    
    // 调用AI服务
    const response = await aiServiceFactory.chat(messages, options, provider);
    
    res.json({
      code: 200,
      message: "调用AI服务成功",
      data: response
    });
    
  } catch (error) {
    console.error('[AI Route] Chat failed:', error);
    
    const statusCode = error.message.includes('认证失败') ? 401 : 
                      error.message.includes('频率限制') ? 429 : 
                      error.message.includes('网络连接失败') ? 502 : 500;
    
    res.status(statusCode).json({
      code: 500,
      error: 'AI聊天失败',
      message: error.message,
      provider: provider || 'auto'
    });
  }
});

/**
 * 生成文本接口
 * POST /api/ai/generate
 * Body: {
 *   prompt: string, // 提示文本
 *   provider: string, // 可选，指定AI服务提供商
 *   options: Object // 可选，额外选项
 * }
 */
router.post('/generate', async (req, res) => {
  try {
    const { prompt, provider, options = {} } = req.body;
    
    // 参数验证
    if (!prompt || typeof prompt !== 'string') {
      return res.status(400).json({
        code: 500,
        error: '参数错误',
        message: 'prompt参数必须是字符串'
      });
    }
    
    // 调用AI服务
    const generatedText = await aiServiceFactory.generateText(prompt, options, provider);
    
    res.json({
      code: 200,
      message: "调用AI服务成功",
      data: {
        text: generatedText,
        prompt: prompt
      }
    });
    
  } catch (error) {
    console.error('[AI Route] Generate text failed:', error);
    
    const statusCode = error.message.includes('认证失败') ? 401 : 
                      error.message.includes('频率限制') ? 429 : 
                      error.message.includes('网络连接失败') ? 502 : 500;
    
    res.status(statusCode).json({
      code: 500,
      error: '文本生成失败',
      message: error.message,
      provider: provider || 'auto'
    });
  }
});

/**
 * 流式聊天接口
 * POST /api/ai/chat/stream
 * Body: {
 *   messages: Array, // 消息数组
 *   provider: string, // 可选，指定AI服务提供商
 *   options: Object // 可选，额外选项
 * }
 */
router.post('/chat/stream', async (req, res) => {
  try {
    const { messages, provider, options = {} } = req.body;
    
    // 参数验证
    if (!messages || !Array.isArray(messages) || messages.length === 0) {
      return res.status(400).json({
        code: 500,
        error: '参数错误',
        message: 'messages参数必须是非空数组'
      });
    }
    
    // 设置流式响应头
    res.writeHead(200, {
      'Content-Type': 'text/plain; charset=utf-8',
      'Transfer-Encoding': 'chunked',
      'Cache-Control': 'no-cache',
      'Connection': 'keep-alive'
    });
    
    // 获取指定的AI服务
    const service = provider ? aiServiceFactory.getService(provider) : await aiServiceFactory.getBestService();
    
    // 流式响应
    for await (const chunk of service.chatStream(messages, options)) {
      const chunkData = JSON.stringify({
        type: 'chunk',
        data: chunk
      }) + '\n';
      
      res.write(chunkData);
    }
    
    // 发送结束标记
    res.write(JSON.stringify({ type: 'end' }) + '\n');
    res.end();
    
  } catch (error) {
    console.error('[AI Route] Stream chat failed:', error);
    
    // 发送错误信息
    const errorData = JSON.stringify({
      type: 'error',
      error: error.message,
      provider: provider || 'auto'
    }) + '\n';
    
    res.write(errorData);
    res.end();
  }
});

/**
 * 商品描述生成接口（转转商城专用）
 * POST /api/ai/generate/goods-description
 * Body: {
 *   title: string, // 商品标题
 *   category: string, // 商品分类
 *   condition: string, // 商品状况
 *   price: number, // 商品价格
 *   provider: string, // 可选，指定AI服务提供商
 * }
 */
router.post('/generate/goods-description', async (req, res) => {
  try {
    const { title, category, condition, price, provider } = req.body;
    
    // 参数验证
    if (!title) {
      return res.status(400).json({
        code: 500,
        error: '参数错误',
        message: 'title参数不能为空'
      });
    }
    
    // 构建提示词
    const prompt = `请为二手交易平台的商品生成一个吸引人的描述：

商品标题：${title}
${category ? `商品分类：${category}` : ''}
${condition ? `商品状况：${condition}` : ''}
${price ? `价格：${price}元` : ''}

要求：
1. 描述要真实、详细、吸引人
2. 突出商品的特点和优势
3. 适合二手交易平台的风格
4. 长度在100-200字之间
5. 不要使用夸张的宣传用语

请生成商品描述：`;
    
    // 调用AI服务
    const description = await aiServiceFactory.generateText(prompt, {
      maxTokens: 500,
      temperature: 0.8
    }, provider);
    
    res.json({
      code: 200,
      message: "调用AI服务成功",
      data: {
        description: description.trim(),
        prompt: prompt
      }
    });
    
  } catch (error) {
    console.error('[AI Route] Generate goods description failed:', error);
    
    res.status(500).json({
      code: 500,
      error: '商品描述生成失败',
      message: error.message
    });
  }
});

/**
 * 价格建议接口（转转商城专用）
 * POST /api/ai/suggest/price
 * Body: {
 *   title: string, // 商品标题
 *   category: string, // 商品分类
 *   condition: string, // 商品状况
 *   originalPrice: number, // 原价（可选）
 *   provider: string, // 可选，指定AI服务提供商
 * }
 */
router.post('/suggest/price', async (req, res) => {
  try {
    const { title, category, condition, originalPrice, provider } = req.body;
    
    // 参数验证
    if (!title) {
      return res.status(400).json({
        code: 500,
        error: '参数错误',
        message: 'title参数不能为空'
      });
    }
    
    // 构建提示词
    const prompt = `请为转转二手交易平台的商品提供价格建议：

商品标题：${title}
${category ? `商品分类：${category}` : ''}
${condition ? `商品状况：${condition}` : ''}
${originalPrice ? `原价：${originalPrice}元` : ''}

要求：
1. 根据商品状况和市场行情提供合理的价格建议
2. 考虑二手商品的折旧因素
3. 给出价格范围和具体建议
4. 说明定价理由

请提供价格建议：`;
    
    // 调用AI服务
    const suggestion = await aiServiceFactory.generateText(prompt, {
      maxTokens: 300,
      temperature: 0.7
    }, provider);
    
    res.json({
      code: 200,
      message: "调用AI服务成功",
      data: {
        suggestion: suggestion.trim(),
        prompt: prompt
      }
    });
    
  } catch (error) {
    console.error('[AI Route] Suggest price failed:', error);
    
    res.status(500).json({
      code: 500,
      message: '价格建议生成失败',
      message: error.message
    });
  }
});

module.exports = router;